This Firebase Cloud Function, using Express.js middleware, provides a remote procedure call (RPC) endpoint that accepts function names from requests, executes them, and returns the results as JSON responses. It also logs the results and handles cookies and CORS.
npm run import -- "google cloud function rpc wrapper"var cookie = require('cookie');
var cors = require('cors')({origin: true});
var importer = require('../Core');
var getResult = importer.import("rpc result");
var getEnvironment = importer.import("get environment");
var expressToResult = (req, res) => getResult({
command: (req.body || {})['function'] || (req.query || {})['function'],
result: importer.interpret((req.body || {})['function'] || (req.query || {})['function']),
body: req.method === 'POST' ? req.body : req.query,
circles: ['Public']
})
var logResult = (r) => {
// TODO: call storeResult()?
var result = typeof r === 'object'
? Object.keys(r).reduce((alt, key) => {
alt[key] = r[key] + '';
return alt;
}, {})
: ('' + r);
console.log(result);
return result;
}
function expressHandler(req, res) {
getEnvironment();
req.cookies = cookie.parse(req.get('cookie') || '');
res.setHeader('Cache-Control', 'private');
cors(req, res, () => {});
return Promise.resolve()
.then(() => expressToResult(req, res))
.then(r => (res.status(200), r))
.catch(e => (res.status(500), e))
.then(r => logResult(r))
.then(r => res.send(r));
}
module.exports.handler = expressHandler;
const cookie = require('cookie');
const cors = require('cors')({ origin: true });
const { importModule } = require('../Core');
const { getResult, interpret } = importModule(['rpc result', 'get environment']);
const expressToResult = (req, res) => {
const func = req.body?.function || req.query?.function;
const data = req.method === 'POST'? req.body : req.query;
const result = getResult({
command: func,
result: interpret(func),
body: data,
circles: ['Public'],
});
return result;
};
const logResult = (r) => {
let result;
if (typeof r === 'object') {
result = Object.fromEntries(Object.entries(r).map(([key, value]) => [key, value.toString()]));
} else {
result = r.toString();
}
console.log(result);
return result;
};
const expressHandler = (req, res) => {
getEnvironment();
req.cookies = cookie.parse(req.get('cookie') || '');
res.setHeader('Cache-Control', 'private');
cors(req, res, () => {});
return Promise.resolve()
.then(() => expressToResult(req, res))
.then((r) => {
res.status(200);
return r;
})
.catch((e) => {
res.status(500);
return e;
})
.then(logResult)
.then((r) => res.send(r));
};
module.exports.handler = expressHandler;This code sets up an Express.js middleware function for a Firebase Cloud Function that acts as a remote procedure call (RPC) endpoint.
Here's a breakdown:
Dependencies:
cookie for parsing cookies, cors for handling cross-origin requests, and custom modules importer and getResult.expressToResult Function:
getResult to interpret the function name and execute the corresponding logic.logResult Function:
storeResult to persist the result.expressHandler Function:
Cache-Control header to private.expressToResult to process the request.Export:
expressHandler function as the Cloud Function's handler.